/*
	Интерполяция сплайнами
*/

#include <math.h>
#include <stdio.h>
#include <assert.h>
#include "sinpol.h"

/* Обратная задача поиска корня */
#define task_calc_x

/* Производящая функция */
double gen_func(const double arg_x)
{
    return exp(arg_x);
}

int main(void)
{
    /* Степень полинома */
    int sinpol_degr = 0;

    /* Границы аргументов */
    double arg_start, arg_end, arg_poly;
    arg_start = arg_end = arg_poly = 0;

    /* Получение данных */
    printf("\n Количество узлов: ");
    scanf("%d", &sinpol_degr);

    printf("\n Границы аргументов производящей функции: ");
    scanf("%lf, %lf", &arg_start, &arg_end);

    do
    {
        #ifndef task_calc_x
        printf("\n Значение X: ");
        #else
        printf("\n Значение Y: ");
        #endif
        scanf("%lf", &arg_poly);

    } while(arg_poly < arg_start || arg_poly > arg_end);

    /* Создание объекта интерполирования */
    sinpol_t *sinpol_o = sinpol_new(sinpol_degr);
    assert(sinpol_o);

    /* Генерирование данных */
    sinpol_gen_data(sinpol_o, arg_start, arg_end, gen_func);

    #ifdef task_calc_x
    void *rev = sinpol_o->vals_y;
    sinpol_o->vals_y = sinpol_o->vals_x;
    sinpol_o->vals_x = rev;
    #endif

    sinpol_build(sinpol_o);

    /* Интерполирование */
    double val_poly = sinpol_get_val(sinpol_o, arg_poly);

    #ifndef task_calc_x
    double val_real = gen_func(arg_poly);
    double fault_pract = val_real - val_poly;
    #endif

    /* Вывод исходных данных */
    #ifndef task_calc_x
    printf("\n%8s\t%8s\n\n", "X", "Y");
    #else
    printf("\n%8s\t%8s\n\n", "Y", "X");
    #endif

    for(int i = 0; i < sinpol_degr; i++)
    {
        printf("%8.4lf\t%8.4lf\n", sinpol_o->vals_x[i], sinpol_o->vals_y[i]);
    }

    /* Вывод данных */
    printf("\n Результат: %.4lf", val_poly);

    #ifdef task_calc_x
    printf("\n\n");
    #else
    printf("\n Реальный результат: %.4lf", val_real);
    printf("\n Практическая погрешность: %.4lf\n\n", fault_pract);
    #endif

    sinpol_destroy(sinpol_o);

    return 0;
}